//
// Created by Leaf on 2025/8/17.
//

#include "ESP_NOW.h"
#include <esp_wifi.h>
#include "stdio.h"

// 全局ESP-NOW管理器实例
ESPNowManager espNowManager;

// ESP-NOW发送回调函数
void OnDataSent(const uint8_t *mac, esp_now_send_status_t status) {
    if(status != ESP_NOW_SEND_SUCCESS){
        printf("send failed!");
    }
}

// ESP-NOW接收回调函数
void OnDataRecv(const uint8_t *mac, const uint8_t *data, int len) {
    printf("received:%s\n", data);
}

/***************************************************************************************************************************/
// ESP-NOW管理器构造函数
ESPNowManager::ESPNowManager(bool master) 
    : currentState(ESPNOW_STATE_UNINITIALIZED),isMaster(master){

    // 初始化MAC地址为0
    memset(masterMacAddress, 0, 6);
    memset(&peerInfo, 0, sizeof(peerInfo));
}

// 设置加密
void ESPNowManager::setEncryption(bool enable, const char* key) {
    peerInfo.channel = 0; // 自动选择信道
    peerInfo.encrypt = enable; // 设置加密标志
    
    // 如果启用加密且提供了密钥，则设置密钥
    if (enable && key) {
        memcpy(peerInfo.lmk, key, 16); // LMk密钥长度为16字节
    }
    esp_now_add_peer(&peerInfo);
}

// 初始化ESP-NOW管理器
void ESPNowManager::begin(uint8_t broadcastMac[], bool encr, const char* key) {
    WiFi.mode(WIFI_STA);    // 设置WIFI模式为STA模式，即无线终端
    printf("Device MAC->>>%s\n", WiFi.macAddress().c_str());
    //  初始化ESP-NOW
    currentState = ESPNOW_STATE_INITIALIZING;
    if (esp_now_init() != ESP_OK) {
        printf("Error initializing ESP-NOW");
        currentState = ESPNOW_STATE_ERROR;
    }

    // 注册回调函数
    registerSendCallback();
    registerReceiveCallback();

    currentState = ESPNOW_STATE_READY;
    printf("ESP-NOW Initialization successful");

    registerSendCallback();
    registerReceiveCallback();

    memcpy(peerInfo.peer_addr, broadcastMac, 6);    // 设置目标MAC地址
    setEncryption(encr, key);                // 设置是否加密
}

// 获取本机MAC地址
void ESPNowManager::getLocalMacAddress(uint8_t* mac_addr) const {
    /**
     * @brief 获取本机MAC地址
     * @param mac_addr 存储MAC地址的缓冲区
     */
    if (mac_addr) {
        // 确保WiFi已初始化
        if (WiFi.status() == WL_DISCONNECTED) {
            WiFi.mode(WIFI_STA);
        }
        esp_wifi_get_mac(WIFI_IF_STA, mac_addr);
    }
}

// 获取本机MAC地址字符串
char* ESPNowManager::getLocalMacAddressString(char* mac_str) const {
    /**
     * @brief 获取本机MAC地址字符串
     * @param mac_str 存储MAC地址字符串的缓冲区，至少需要18个字节
     * @return 返回MAC地址字符串指针
     */
    if (mac_str) {
        uint8_t mac_addr[6];
        getLocalMacAddress(mac_addr);
        sprintf(mac_str, "%02X:%02X:%02X:%02X:%02X:%02X",
                mac_addr[0], mac_addr[1], mac_addr[2],
                mac_addr[3], mac_addr[4], mac_addr[5]);
    }
    return mac_str;
}

// 获取当前ESP-NOW状态
ESPNowState ESPNowManager::getState() const {
    return currentState;
}

// 注册发送回调函数
void ESPNowManager::registerSendCallback() {
    esp_now_register_send_cb(OnDataSent);
}
// 注册接收回调函数
void ESPNowManager::registerReceiveCallback() {
    esp_now_register_recv_cb(OnDataRecv);
}

// 发送数据
void ESPNowManager::sendData(uint8_t* data, uint8_t len) {
    esp_now_send(peerInfo.peer_addr, data, len);
}